// 后序线索化

// 全局变量 指向当前访问节点的前驱

ThreadNode *pre = NULL;

// 后序线索化二叉树
void CreatePostThread(ThreadTree T)
{
    pre = NULL;  // pre初始化为空
    if(T!=NULL)  // 非空二叉树才能线索化
    {
        PostThread(T);  // 后序线索化二叉树
        if (pre->rchild == NULL)  // 处理最后一个节点
        {
            pre->rtag = 1;
        }
        
    }
}

// 后序遍历二叉树  一边遍历，一边线索化

void PostThread(ThreadTree T)
{
    if(T!=NULL)
    {
        PostThread(T->lchild);
        PostThread(T->rchild);
        visit(T);
    }
}

void visit(ThreadNode *q)
{
    if(T->lchild == NULL)  // 左空  前驱线索
    {
        T->lchild = pre;
        T->ltag = 1;
    }
    if(pre != NULL && pre->rchild==NULL)  // 前驱右空 后继线索
    {
        pre->rchild = q;
        pre->rtag = 1;
    }

    pre = q;  // 更新前驱
}